为什么要搭建 Redis 集群?
虽然Redis
单机性能已经很高了,但是 实际上Redis
是可以像MySQL
那样支持主从结构的,也就是常见的读写分离,主机master
负责键的新增和修改,从机slave
负责读。
不仅如此,在保证高可用方面,官方推出了Sentinel
(哨兵)作为高可用的解决方案,在集群中的节点出现故障时能够及时进行故障转移,踢掉不可用的节点。
这篇文章记录下在本地使用docker
来搭建 Redis
主从的过程,把遇到的问题都记录下来,注意,这里只是简单的搭建主从集群,模式为一主多从,并不保证高可用。
系统:Mac
redis 版本:4.0
docker 版本:17.09.0-ce-mac35 (19611)
获取 Redis 镜像
这里我们先获取镜像,获取镜像可以从Docker hub
获取,觉得慢的话或者使用国内的镜像。1
docker pull redis
拉取到的镜像为
配置 Redis 集群
我们打算搭建的是一个一主二从的结构,首先需要获取配置文件redis.conf
,你可能有疑问,下载的镜像不是开箱即用的吗?为什么还需要单独下载配置文件?主要是因为我们想更方便的去管理这个配置文件,修改和管理会更加方便。而且由于是放在外面,不会有丢失的危险。
这里我们从官网下载一份标准的配置1
http://download.redis.io/redis-stable/redis.conf
下载完成后,复制为三份,分别命名为redis-master1.conf
,redis-slave1.conf
,redis-slave2.conf
,分别是主机的配置和两个从机的配置。文件的放置目录没有特殊要求,放在一个单独的文件夹即可。
对redis-master.conf
做如下修改:1
bind 0.0.0.0 #原来是 bind 127.0.0.0.1
对redis-slave1.conf
做如下修改:1
2bind 0.0.0.0 #原来是 bind 127.0.0.0.1
slaveof redis-master1 6379
对redis-slave2.conf
做如下修改:1
2bind 0.0.0.0 #原来是 bind 127.0.0.0.1
slaveof redis-master1 6379
slaveof
:作为另一台机器的从机,这里表示salve1
和salve2
作为master1
的从机。这里可以直接写redis-master1
是因为是服务的名字,后面会说。
启动主从容器
配置完成后,接着我们就需要启动三个容器了,我们这里借助docker compose
容器编排来进行管理,避免执行docker run
后面跟一大串参数。
我的目录结构如下:
三个配置文件是在conf
目录下的。
在当前目录下,创建docker-compose.yml
文件。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32version: '3'
services:
redis-master1:
image: redis
container_name: redis-master1
volumes:
- "/Users/jarviszhao/docker/redis/conf/:/usr/local/etc/redis/"
ports:
- "6382:6379"
command: redis-server /usr/local/etc/redis/redis-master1.conf
redis-slave1:
image: redis
container_name: redis-slave1
volumes:
- "/Users/jarviszhao/docker/redis/conf:/usr/local/etc/redis/"
ports:
- "6380:6379"
command: redis-server /usr/local/etc/redis/redis-slave1.conf
links:
- redis-master1
redis-slave2:
image: redis
container_name: redis-slave2
volumes:
- "/Users/jarviszhao/docker/redis/conf:/usr/local/etc/redis/"
ports:
- "6381:6379"
command: redis-server /usr/local/etc/redis/redis-slave2.conf
links:
- redis-master1
- 上面包含三个服务(services)
redis-master1
,redis-slave2
,redis-slave1
links
,将两个容器进行连接,这个连接信息其实是一个hosts
映射。如果你打开两个通过–link参数连接的容器中的某个容器的/etc/hosts文件,你将看到如下内容:
1
2
3
4 ...
# 以下记录了容器的连接信息
172.17.0.2 master 385f6821c0db redis-master
172.17.0.3 54466fb83744
3.
ports
指定了端口映射,容器和主机的端口进行映射,方便我们查看数据。
4.volumes
把对应的配置文件分别拷贝到容器中。
5.command
:容器启动的时候执行的命令,加载拷贝到容器的配置文件进行启动。
最后,执行启动命令:1
docker-compose up
打印信息如下:
三个容器分别启动了。
此时使用redis-cli info replication
命令查看复制信息。
可以看到,角色是master
,有两个从机。
查看从机的信息:
表示这是一台从机。
此时在主机执行一个测试命令set name jarvis
,可以看到从机也出现了这个数据。
完美!